<?php

class UClientSSO
{
    private static $_ucSessKey = 'userInfo';
    //初始化session相关
    static public function _init(){
        
    }
    
    //移除本地sessionId
    static public function _removeLocalSid(){
        session_destroy();
    }
    
    //取得参数集合
    static public function _getCheckSum(){
        
    }
    
    //接口调用选择器
    static public function _callSoap($serviceName,$params){
        
    }
    
    //设置本地sessionId
    static public function _setLocalSid($sessionId){
        session_id($sessionId);
        session_start();
    }
    
    //取得本地sessionId
    static public function _getLocalSid(){
        return session_id();
    }
    
    //判断用户名和密码是否通过
    static public function _getUserPassSalt($userLoginId,$password){
        
    }
    
    //注册登录站点信息
    static public function registerLoggedSite($siteFlag,$sessionId){
        
    }
    
    /**
     * 用户验证中心 登陆用户处理
     * @param string $username
     *            - 用户名
     * @param string $password
     *            - 用户原始密码
     * @param boolean $remember
     *            - 是否永久记住登陆账号
     * @param boolean $alreadyEnc
     *            - 传入的密码是否已经经过simpleEncPass加密过
     * @return array - integer $return['status'] 大于 0:返回用户 ID，表示用户登录成功
     *         -1:用户不存在，或者被删除
     *         -2:密码错
     *         -11：验证码错误
     *         string $return['username'] : 用户名
     *         string $return['password'] : 密码
     *         string $return['email'] : Email
     */
    static public function loginSSO ($username, $password, $remember = false, $alreadyEnc = false)
    {
        self::_init();
        self::_removeLocalSid();
        $ret = array();
        
        // 1. 处理传入webservice接口的参数
        $_params = array(
                'username' => $username,
                'password' => $alreadyEnc ? trim($password) : self::simpleEncPass(trim($password)),
                'ip' => self::onlineip(),
                'siteFlag' => self::$site,
                'remember' => $remember
        );
        $_params['checksum'] = self::_getCheckSum($_params['username']. $_params['password'].$_params['ip'].$_params['siteFlag'].$_params['remember']);
        
        // 2.调用webservice接口，进行登陆处理
        $aRet = self::_callSoap('loginUCenter', $_params);
        
        if (intval($aRet['resultFlag']) > 0 && $aRet['sessID']) {
            // 成功登陆
            // 设置本地session id
            self::_setLocalSid($aRet['sessID']);
            
            // 设置用户中心的统一session id脚本路径
            self::$_synloginScript = urldecode($aRet['script']);
            $ret = $aRet['userinfo'];
        } else {
            $ret['status'] = $aRet['resultFlag'];
        }
        return $ret;
    }
      
    // b) 用户验证中心的webservice服务程序，接收到登陆验证请求后，调用UCenter::loginUCenter()方法来处理登陆请求。
    /**
     * 用户验证中心 登陆用户处理
     *
     * @param string $username            
     * @param string $password            
     * @param string $ip            
     * @param string $checksum            
     * @return array
     */
    static public function loginUCenter ($username, $password, $ip, $siteFlag, $remember = false)
    {
        self::_init();
        session_start();
        $ret = array();
        //登录信息数组值
        $arr_login_res = login_user($username, $password, $ip);
        $res_login = $arr_login_res['status']; //
        $ret['resultFlag'] = $res_login;
        
        if ($res_login < 1) {
            // 登陆失败
        } else {
            // 登陆成功
            $_SESSION[self::$_ucSessKey] = $arr_login_res;
            
            $_SESSION[self::$_ucSessKey]['salt'] = self::_getUserPassSalt(
                    $_SESSION[self::$_ucSessKey]['username'], 
                    $_SESSION[self::$_ucSessKey]['password']);
            
            $ret['userinfo'] = $_SESSION[self::$_ucSessKey];
            $ret['sessID'] = session_id(); // 生成全站的唯一session id，作为ticket全站通行
                                             // 合作中心站回调登陆接口(设置用户中心的统一session id)
                                             //
            self::_createCoSitesInfo();
            $uinfo = array();
            $_timestamp = time();
            $_rawCode = array(
                    'action' => 'setSid',
                    'sid' => $ret['sessID'],
                    'time' => $_timestamp
            );
            if ($remember) {
                $uinfo = array(
                        'remember' => 1,
                        'username' => $username,
                        'password' => $password
                );
            }
            
            $ret['script'] = '';
            $_rawStr = http_build_query(array_merge($_rawCode, $uinfo));
            
            // 合作站点的全域cookie设置脚本地址
            foreach ((array) self::$_coSitesInfo as $_siteInfo) {
                $_code = self::authcode($_rawStr, 'ENCODE', $_siteInfo['key']);
                $_src = $_siteInfo['url'] . '?code=' . $_code . '&time=' .
                         $_timestamp;
                $ret['script'] .= urlencode('');
            }
            
            // 记住已登陆站点
            self::registerLoggedSite($siteFlag, $ret['sessID']);
            
            unset($ret['userinfo']['salt']);
        }
        
        return $ret;
    }
    
    // *********************
    /**
     * 用户单点登陆验证函数
     *
     * @return array - integer $return['status'] 大于 0:返回用户 ID，表示用户登录成功
     *         0:用户没有在全站登陆
     *         -1:用户不存在，或者被删除
     *         -2:密码错
     *         -3:未进行过单点登陆处理
     *         -11：验证码错误
     *         string $return['username'] : 用户名
     *         string $return['password'] : 密码
     *         string $return['email'] : Email
     */
    public static function checkUserLogin ()
    {
        self::_init();
        $ret = array();
        $_sessId = self::_getLocalSid();
        if (empty($_sessId)) {
            // 永久记住账号处理
            if (isset($_COOKIE[_UC_USER_COOKIE_NAME]) && ! empty($_COOKIE[_UC_USER_COOKIE_NAME])) {
                // 根据cookie里的用户名和密码判断用户是否已经登陆。
                $_userinfo = explode('|g|', self::authcode($_COOKIE[_UC_USER_COOKIE_NAME], 'DECODE', self::$_authcodeKey));
                
                $username = $_userinfo[0];
                $password = isset($_userinfo[1]) ? $_userinfo[1] : '';
                if (empty($password)) {
                    $ret['status'] = - 3;
                } else {
                    return self::loginSSO($username, $password, true, true);
                }
            } else {
                $ret['status'] = - 3;
            }
        } else {
            // 本站原先已经登陆过，通过保留的sesson id存根去用户中心验证
            $_params = array(
                    'sessId' => $_sessId,
                    'siteFlag' => self::$site,
                    'checksum' => md5($_sessId . self::$site . self::$_mcComunicationKey)
            );
            $aRet = self::_callSoap('getOnlineUser', $_params);
            if (intval($aRet['resultFlag']) > 0) {
                // 成功登陆
                $ret = $aRet['userinfo'];
            } else {
                $ret['status'] = $aRet['resultFlag'];
            }
        }
        
        return $ret;
    }
    
    // b) 用户验证中心的webservice服务程序，接收到检验登陆的请求后，调用UCenter::getOnlineUser()方法来处理登陆请求：
    /**
     * 根据sid，获取当前登陆的用户信息
     *
     * @param string $sessId
     *            - 全站唯一session id，用做ticket
     * @return array
     */
    static public function getOnlineUser ($sessId, $siteFlag)
    {
        self::_init();
        session_id(trim($sessId));
        session_start();
        
        $ret = array();
        $_userinfo = $_SESSION[self::$_ucSessKey];
        
        if (isset($_userinfo['userLoginId']) && isset($_userinfo['password']) &&
                 self::_getUserPassSalt($_userinfo['userLoginId'], 
                        $_userinfo['password'])) {
            $ret['resultFlag'] = "1";
            $ret['userinfo'] = $_userinfo;
            
            self::registerLoggedSite($siteFlag, $sessId); // 记住已登陆站点
            unset($ret['userinfo']['salt']);
        } else {
            $ret['resultFlag'] = "0";
        }
        
        return ($ret);
    }
    
    /**
     * 全站单点登出
    *  - 通过webservice请求注销掉用户的全站唯一标识
    *
    * @return integer    1: 成功
    *                                     -11：验证码错误
    */
    public static function logoutSSO(){
        self::_init();
        $_sessId = self::_getLocalSid();
    
        //
        //本站没有登陆的话，不让同步登出其他站
        //
        if (empty($_sessId)) {
            self::_initSess(true);
            return false;
        }
        $_params  = array(
                'sessId'   => $_sessId,
                'siteFlag' => self::$site,
                'checksum' => md5($_sessId . self::$site . self::$_mcComunicationKey)
        );
    
        $aRet = self::_callSoap('logoutUCenter', $_params);
        if (intval($aRet['resultFlag']) > 0) {
            //成功登出
            self::_removeLocalSid();                //移除本站记录的sid存根
            self::$_synlogoutScript = urldecode($aRet['script']);
            $ret = 1;
        } else {
            $ret = $aRet['resultFlag'];
        }
        return intval($ret);
    }                   
    
    //b) 用户验证中心的webservice服务程序，接收到全站登出请求后，调用UCenter::loginUCenter()方法来处理登陆请求：
    /**
    * 登出全站处理
    *
    * @param string - 全站唯一session id，用做ticket
    * @return boolean
    */
    static public function logoutUCenter($sessId) {
        self::_init();
        session_id(trim($sessId));
        session_start();
        
        $_SESSION = array();
        return empty($_SESSION) ? true : false;
    }
}

?>